<?php
//----------------- INSERTION MODIFICATION ET SUPPRESSION DANS LA BASE DE DONNEES --------------------//
$fichierXML = './data/database/exemplebdd.xml';
$fichierDTD = "./data/database/BDD.dtd";

$dom = new DomDocument ();
$dom->formatOutput = TRUE;
$dom->preserveWhiteSpace = true;

if(file_exists($fichierXML))
{
	$dom->load($fichierXML);
	$dom->formatOutput = TRUE;
	$dom->preserveWhiteSpace = true;
}
else
{
	// Créer la base de données si elle existe pas
	creerBDD();
}
$dom->validate();

// Création de la base de données
function creerBDD()
{
	global $fichierDTD;
	global $fichierXML;
	global $dom;
	
	$dom = DOMImplementation::createDocument(null, null,
    DOMImplementation::createDocumentType("BDD", "", $fichierDTD));
	
	$dom->formatOutput = TRUE;
	$dom->preserveWhiteSpace = true;
   $firstchild = $dom->createElement('BDD');
   
   $firstchild->appendChild($dom->createElement('types_exercices'));
   $firstchild->appendChild($dom->createElement('videos'));
   $firstchild->appendChild($dom->createElement('themes'));
   $firstchild->appendChild($dom->createElement('exercices'));
   $firstchild->appendChild($dom->createElement('utilisateurs'));
   $firstchild->appendChild($dom->createElement('scores'));
   $firstchild->appendChild($dom->createElement('shadowings')); 
   $dom->appendChild($firstchild);
   
   // ajoût du thème autre
   $dom->ajouterTheme("idAutre", "Autre");
   $dom->save($fichierXML);
}

// Ajoute une vidéo à la base de données
// Renvoie faux si une vidéo du même id existe déjà
function ajoutVideo($idvideo, $nom="", $idtheme="idAutre", $duree="", $fichiersoustitre="", $fichierVideo="", $description="", $difficulte="1")
{
	global $dom;
	global $fichierXML;
	$dom->formatOutput = TRUE;
	$dom->preserveWhiteSpace = true;
	
	// Vérification que l'id n'existe pas déjà
	if ($dom->getElementById($idvideo) == null)
	{
		// Création des noeuds
		$cible = $dom->getElementsByTagName("videos");
		$noeudVideo = $cible->item(0);
		$newVideo = $dom->createElement("video");
		$newVideo->setAttribute("id", $idvideo);
		$newVideo->setAttribute("id_theme", $idtheme);
		
		// Ajout du noeud nom
		$child = $dom->createElement("nom", $nom);
		$newVideo->appendChild($child);
		
		//ajout des dates
		$child = $dom->createElement("date_creation",  date("d/m/y"));
		$newVideo->appendChild($child);
		
		$child = $dom->createElement("date_modification", date("d/m/y"));
		$newVideo->appendChild($child);
		
		// Ajout description
		$child = $dom->createElement("description", $description);
		$newVideo->appendChild($child);
		
		$child = $dom->createElement("duree", $duree);
		$newVideo->appendChild($child);
		
		// Ajout difficulté
		$child = $dom->createElement("difficulte", $difficulte);
		$newVideo->appendChild($child);
		
		// Ajout du noeud fichier
		$child = $dom->createElement("fichier", $fichierVideo);
		$newVideo->appendChild($child);
		
		// Ajout du noeud fichiersoustitre
		$child = $dom->createElement("fichier_soustitre", $fichiersoustitre);
		$newVideo->appendChild($child);
		
		// Ajout balises exercice
		$baliseExercice = $dom->createElement("exercices_video");
		$newVideo->appendChild($baliseExercice);
		
		if ($cible != null)
		{
			$noeudVideo->appendChild($newVideo);
		}
		
		$dom->save($fichierXML);
		return true;
	}	
	else
	{
		return false;
	}
}


// Modifie une vidéo à partir de tous ces champs
function modifierVideo($idvideo, $nom, $dateModif, $idtheme, $duree, $fichiersoustitre, $fichierVideo, $description, $difficulte)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idvideo);
	if ($video != null)
	{
		$video->setAttribute("id_theme", $idtheme);
		$video->setAttribute("id_soustitrevideo", $idsoustitre);
		foreach ($video->childNodes as $child)
		{
			switch($child->nodeName)
			{
				case "nom":$video->replaceChild($dom->createElement("nom", $nom), $child); break;
				case "date_modification":$video->replaceChild($dom->createElement("date_modification", $datemodif), $child); break;
				case "duree":$video->replaceChild($dom->createElement("duree", $duree), $child); break;
				case "fichier":$video->replaceChild($dom->createElement("fichier", $fichierVideo), $child); break;
				case "fichier_soustitre":$video->replaceChild($dom->createElement("fichier_soustitre", $fichiersoustitre), $child); break;
				case "description":$video->replaceChild($dom->createElement("description", $description), $child); break;
				case "difficulte":$video->replaceChild($dom->createElement("difficulte", $difficulte), $child);break;
				default:break;
			}
			
		}
		$dom->save($fichierXML);		
		
		return true;
		
		
	}
	else
	{
		return false;
	}
}


function changerNom($idVideo, $newnom)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
		// vérification de que le nouveau nom ne soit pas l'ancien
		if (nomVideo($idVideo) != $newnom)
		{
			foreach ($video->childNodes as $child)
			{
				if ($child->nodeName == "nom")
				{
					$video->replaceChild($dom->createElement("nom", $newnom), $child);
					break;
				}			
			}
			$dom->save($fichierXML);	
			changerDateModif($idVideo);	
			return true;	
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}	
}


function changerSRT($idVideo, $newSRT)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
		// vérification de que le nouveau nom ne soit pas l'ancien
		if (fichierSRT($idVideo) != $newSRT)
		{
			foreach ($video->childNodes as $child)
			{
				if ($child->nodeName == "fichier_soustitre")
				{
					$video->replaceChild($dom->createElement("fichier_soustitre", $newSRT), $child);
					break;
				}			
			}
			$dom->save($fichierXML);	
			changerDateModif($idVideo);	
			return true;	
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}	
}

function changerTheme($idVideo, $nomnewTheme)
{
	global $dom;
	global $fichierXML;
	
	$idnewTheme = idtheme($nomnewTheme);
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
		// vérification de que le nouveau nom ne soit pas l'ancien
		if (idThemeVideo($idVideo) != $idnewTheme)
		{
			$video->setAttribute("id_theme", $idnewTheme);		
			$dom->save($fichierXML);		
			changerDateModif($idVideo);	
			return true;	
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}	
}
function changerNiveau($idVideo, $newNiveau)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
		// vérification de que le nouveau nom ne soit pas l'ancien
		if (difficulte($idVideo) != $newNiveau)
		{
			foreach ($video->childNodes as $child)
			{
				if ($child->nodeName == "difficulte")
				{
					$video->replaceChild($dom->createElement("difficulte", $newNiveau), $child);
					break;
				}			
			}
			$dom->save($fichierXML);		
			changerDateModif($idVideo);
			return true;	
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}	
}
// change le nom de la vidéo
function changerDescription($idVideo, $newDesc)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
		// vérification de que le nouveau nom ne soit pas l'ancien
		if (description($idVideo) != $newDesc)
		{
			foreach ($video->childNodes as $child)
			{
				if ($child->nodeName == "description")
				{
					$video->replaceChild($dom->createElement("description", $newDesc), $child);
					break;
				}			
			}
			$dom->save($fichierXML);	
			changerDateModif($idVideo);	
			return true;	
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}	
}



function changerDateModif($idVideo)
{
	global $dom;
	global $fichierXML;
	
	$video = $dom->getElementByID($idVideo);
	if ($video != null)
	{
	// vérification de que le nouveau nom ne soit pas l'ancien
	
		foreach ($video->childNodes as $child)
		{			
			if ($child->nodeName == "date_modification")
			{
				$video->replaceChild($dom->createElement("date_modification", date("d/m/y")), $child);
				break;
			}			
		}
		$dom->save($fichierXML);		
		return true;	
	}
	
	else
	{
		return false;
	}	
}


// Supprime n'importe quel élément de la base de données à partir de son identifiant
// Renvoie vrai ou faux si l'élément existe ou non
function supprimerElementByID($id)
{
	global $dom;
	global $fichierXML;
	$elt = $dom->getElementById($id);
	if ($id == "idAutre") // ne pas supprimer le thème autre
	{
		return false;
	}
	if ($elt == null)
	{
		return false;
	}
	else
	{
		$elt->parentNode->removeChild($elt);
		$dom->save($fichierXML);		
		return true;
	}
}

//supprime un theme
//les elements associes sont alors associes au theme par defaut
function supprimerTheme($idTheme){
	
	$videos=listeIDVideoTheme($idTheme);
	
	foreach($videos as $video){
		
		changerTheme($video,'Autre');
		
	}//fin foreach
	
	supprimerElementByID($idTheme);
	
}//fin supprimerTheme

//Supprime une vidéo et tous ses exercices
function supprimerVideo($idvideo)
{
	global $dom;
	global $fichierXML;
	$exercices = listeIDExercicesVideo($idvideo);
	
	$bdd = $dom->getElementsByTagName("BDD")->item(0);
	foreach ($exercices as $idexo)
	{
		supprimerElementByID($idexo);
		supprimerReferences($bdd, $idexo);
		
	}
	supprimerElementByID($idvideo);
	supprimerReferences($bdd, $idvideo);
	
	
	$dom->save($fichierXML);
}

function supprimerReferences($node, $id)
{
	// Recherche de tous les noeuds où id est référencé comme attribut
	if ($node != null && $node->hasAttributes())
	{
		$attrs = $node->attributes; 
        foreach ($attrs as $attr) 
        {
        	if ($attr->value == $id)
        	{
        		$node->parentNode->removeChild($node);
        		return true;
        	}
        }
	}
	if ($node->hasChildNodes())
	{
		$childs = $node->childNodes;
		$supprimer = false;
		foreach ($childs as $child)
		{
			$supprimer = supprimerReferences($child, $id) | $supprimer;
		}
		return $supprimer;
	}
	else
	{
		return false;
	}	
}

// Ajoute un exercice à la base de données et le lie à une vidéo existante.
function ajoutExerciceVideo($idVideo, $idExercice, $typeExo, $fichierExercice)
{
	global $dom;
	global $fichierXML;
	
	// La vidéo à laquelle on ajoute un exercice doit exister
	$video = $dom->getElementById($idVideo);
	// L'id d'un nouvel exercice ne doit pas exister
	$exo = $dom->getElementById($idExercice);
	
	if ($video != null && $exo == null)
	{		
		// Ajout de l'exercice
		$noeudExo = $dom->getElementsByTagName("exercices")->item(0);
		$newexo = $dom->createElement("exercice");
		$newexo->setAttribute("id", $idExercice);
		$newexo->setAttribute("typeExo", $typeExo);
		$newexo->appendChild($dom->createElement("fichier", $fichierExercice));
		
		$noeudExo->appendChild($newexo);
		
		// Association de l'exercice à la vidéo
		
		$listeExo = $video->getElementsByTagName("exercices_video")->item(0);
		$newExoVideo = $dom->createElement("exercice_video");
		$newExoVideo->setAttribute("id_exercice", $idExercice);
		$listeExo->appendChild($newExoVideo);
		
		$dom->save($fichierXML);		
		return true;		
	}
	else
	{
		return false;
	}	
}


function changerFichier($idVideo, $newFile)
{
	global $dom;
	//TODO
	return false;
}


// Ajoute un thème dans la base de données
function ajouterTheme($idTheme, $nomTheme)
{
	global $dom;
	global $fichierXML;
	$cible = $dom->getElementsByTagName("themes");
	$noeudTheme = $cible->item(0);
	$newTheme = $dom->createElement("theme");
	$newTheme->setAttribute("id", $idtheme);
	$newTheme->appendChild($dom->createElement("designation", $nomTheme));
	$noeudTheme.appendChild($newTheme);
		
	$dom->save($fichierXML);
	
	return false;
}



function ajouterTypeExercice($id, $nomType)
{
	global $dom;
	//TODO
	return false;
}

function supprimerTypeExercice($id)
{
	global $dom;
	//TODO
	return false;
}

function ajouterSousTitre($idST, $fichier)
{
	global $dom;
	//TODO
	return false;
}

function ajouterModifierScore($idUser, $idExo, $note)
{
	global $dom;
	//TODO
	return false;
}

function supprimerScore($idUser, $idExo)
{
	global $dom;
	//TODO
	return false;
}

function ajouterShadowing($idUser, $idVideo, $fichier)
{
	global $dom;
	//TODO
	return false;
}

function supprimerShadowing($idUser, $idVideo)
{
	global $dom;
	//TODO
	return false;
}

?>